/** * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# * This file is part of the LDP4j Project: * http://www.ldp4j.org/ * * Center for Open Middleware * http://www.centeropenmiddleware.com/ * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# * Copyright (C) 2014-2016 Center for Open Middleware. * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# * Artifact : org.ldp4j.tutorial.client:eswc-2015-client:1.0.0 * Bundle : eswc-2015-client-1.0.0.jar * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# */ package org.ldp4j.tutorial.client; import java.io.Console; import java.io.PrintStream; import java.util.Arrays; import java.util.Scanner; import java.util.SortedSet; import java.util.concurrent.atomic.AtomicInteger; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; import org.fusesource.jansi.AnsiConsole; class ShellUtil { private static final String[] EMPTY_ARGS = new String[]{}; private static final class DefaultShellConsole implements ShellConsole { private final Scanner scanner=new Scanner(System.in); @Override public boolean isClearable() { return false; } @Override public ShellConsole clear() { throw new UnsupportedOperationException("Console is not clearable"); } @Override public boolean isReadable() { return true; } @Override public String readLine() { return this.scanner.nextLine(); } @Override public ShellConsole data(String fmt, Object... args) { try { System.out.printf(fmt,args); } catch (Exception e) { showFailure(e, fmt, args); } return this; } @Override public ShellConsole metadata(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole message(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole title(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole prompt(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole error(String fmt, Object... args) { return data(fmt,args); } } private static final class NativeShellConsole implements ShellConsole { private final Console console; private NativeShellConsole(Console console) { this.console = console; } @Override public boolean isClearable() { return false; } @Override public ShellConsole clear() { throw new UnsupportedOperationException("Console is not clearable"); } @Override public boolean isReadable() { return true; } @Override public String readLine() { return this.console.readLine(); } @Override public ShellConsole data(String fmt, Object... args) { try { this.console.format(fmt,args); } catch (Exception e) { showFailure(e, fmt, args); } return this; } @Override public ShellConsole metadata(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole message(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole title(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole prompt(String fmt, Object... args) { return data(fmt,args); } @Override public ShellConsole error(String fmt, Object... args) { return data(fmt,args); } } private static final class AnsiShellConsole implements ShellConsole { private final PrintStream output; private ShellConsole console; private AnsiShellConsole(PrintStream out, ShellConsole console) { this.output = out; this.console = console; } @Override public ShellConsole data(String fmt, Object... args) { colorize(Color.DEFAULT, Color.DEFAULT, fmt, args); return this; } private void colorize(Color bg, Color fg, String fmt, Object... args) { try { Ansi ansi = Ansi. ansi(). bg(bg). fg(fg). a(String.format(fmt,args)). reset(); this.output.print(ansi); } catch (Exception e) { showFailure(e, fmt, args); } } @Override public ShellConsole metadata(String fmt, Object... args) { colorize(Color.DEFAULT, Color.YELLOW, fmt, args); return this; } @Override public ShellConsole message(String fmt, Object... args) { colorize(Color.DEFAULT, Color.GREEN, fmt, args); return this; } @Override public String readLine() { return this.console.readLine(); } @Override public ShellConsole title(String fmt, Object... args) { try { Ansi ansi = Ansi. ansi(). bold(). bg(Color.DEFAULT). fg(Color.RED). a(String.format(fmt,args)). reset(); this.output.print(ansi); } catch (Exception e) { showFailure(e, fmt, args); } return this; } @Override public ShellConsole prompt(String fmt, Object... args) { colorize(Color.DEFAULT, Color.CYAN, fmt, args); return this; } @Override public ShellConsole error(String fmt, Object... args) { colorize(Color.DEFAULT, Color.RED, fmt, args); return this; } @Override public boolean isClearable() { return true; } @Override public ShellConsole clear() { Ansi ansi= Ansi. ansi(). eraseScreen(). cursor(1,1); this.output.print(ansi); return this; } @Override public boolean isReadable() { return this.console.isReadable(); } } private ShellUtil() { } private static void showFailure(Exception failure, String fmt, Object... args) { System.err.printf("[INTERNAL ERROR] Could not print message: %s%n- Offending message:%n", failure.getMessage()); System.err.println(" + Format: "+fmt); if(args.length>0) { System.err.println(" + Arguments: "); for(Object arg:args) { StringBuilder builder= new StringBuilder(). append(" * "). append(arg.getClass().getCanonicalName()). append(" : "). append(arg); System.err.println(builder); } } } private static void showField(ShellConsole console, String name, String value) { if(value!=null) { console.metadata("- %s : ",name).data("%s%n",value); } } static ShellConsole console() { String property = System.getProperty("shell.console","native"); ShellConsole console=new DefaultShellConsole(); Console nativeConsole = System.console(); if(nativeConsole!=null) { console = new NativeShellConsole(nativeConsole); if(property.equalsIgnoreCase("ansi")) { console=new AnsiShellConsole(AnsiConsole.out(), console); } } return console; } static String extractCommandName(String[] commandLineParts) { return commandLineParts[0]; } static String[] split(String rawCommandLine) { return rawCommandLine.split("\\s"); } static String[] extractCommandArguments(String[] commandLineParts) { String[] commandArgs=ShellUtil.EMPTY_ARGS; if(commandLineParts.length>1) { commandArgs=Arrays.copyOfRange(commandLineParts,1,commandLineParts.length); } return commandArgs; } static CommandProcessor createProcessor(String name) { Command targetCmd = Command.fromString(name); CommandProcessor result=new NullCommandProcessor(); if(targetCmd!=null) { result=targetCmd.createProcessor(); } return result; } static void showResourceContent(ShellConsole console, Resource resource) { String entity = resource.entity(); if(entity!=null) { showField(console, "Content Type", resource.contentType()); console.metadata("- Content :%n").data(entity).data("%n"); } } static void showResourceMetadata(ShellConsole console, Resource resource) { showField(console, "Entity Tag ", resource.entityTag()); showField(console, "Last Modified", resource.lastModified()); } static void showLinks(ShellConsole console, Links links) { SortedSet<Link> all = links.all(); if(!all.isEmpty()) { console.metadata("- Links: %n"); for(Link link:all) { console. metadata(" + %s : ",link.relation()).data("%s%n",link.value()); } } } private static AtomicInteger counter=new AtomicInteger(); static String nextResourceFile() { return String.format("resource.%04X.%X.dat",counter.incrementAndGet(),System.currentTimeMillis()); } }